home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / tk2.3 / dist / tkGeometry.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-13  |  4.6 KB  |  160 lines

  1. /* 
  2.  * tkGeometry.c --
  3.  *
  4.  *    This file contains code generic Tk code for geometry
  5.  *    management, plus code to manage the geometry of top-level
  6.  *    windows (by reflecting information up to the window
  7.  *    manager).
  8.  *
  9.  * Copyright 1990 Regents of the University of California.
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #ifndef lint
  20. static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGeometry.c,v 1.18 92/05/13 16:51:17 ouster Exp $ SPRITE (Berkeley)";
  21. #endif
  22.  
  23. #include "tkConfig.h"
  24. #include "tkInt.h"
  25.  
  26. /*
  27.  *--------------------------------------------------------------
  28.  *
  29.  * Tk_ManageGeometry --
  30.  *
  31.  *    Arrange for a particular procedure to handle geometry
  32.  *    requests for a given window.
  33.  *
  34.  * Results:
  35.  *    None.
  36.  *
  37.  * Side effects:
  38.  *    Proc becomes the new geometry manager for tkwin, replacing
  39.  *    any previous geometry manager.  In the future, whenever
  40.  *    Tk_GeometryRequest is called for tkwin, proc will be
  41.  *    invoked to handle the request.  Proc should have the
  42.  *    following structure:
  43.  *
  44.  *    void
  45.  *    proc(clientData, tkwin)
  46.  *    {
  47.  *    }
  48.  *
  49.  *    The clientData argument will be the same as the clientData
  50.  *    argument to this procedure, and the tkwin arguments will
  51.  *    be the same as the corresponding argument to
  52.  *    Tk_GeometryRequest.  Information about the desired
  53.  *    geometry for tkwin is avilable to proc using macros such
  54.  *    as Tk_ReqWidth.  Proc should do the best it can to meet
  55.  *    the request within the constraints of its geometry-management
  56.  *    algorithm, but it is not obligated to meet the request.
  57.  *
  58.  *--------------------------------------------------------------
  59.  */
  60.  
  61. void
  62. Tk_ManageGeometry(tkwin, proc, clientData)
  63.     Tk_Window tkwin;        /* Window whose geometry is to
  64.                  * be managed by proc.  */
  65.     Tk_GeometryProc *proc;    /* Procedure to manage geometry.
  66.                  * NULL means make tkwin unmanaged. */
  67.     ClientData clientData;    /* Arbitrary one-word argument to
  68.                  * pass to proc. */
  69. {
  70.     register TkWindow *winPtr = (TkWindow *) tkwin;
  71.  
  72.     winPtr->geomProc = proc;
  73.     winPtr->geomData = clientData;
  74. }
  75.  
  76. /*
  77.  *--------------------------------------------------------------
  78.  *
  79.  * Tk_GeometryRequest --
  80.  *
  81.  *    This procedure is invoked by widget code to indicate
  82.  *    its preferences about the size of a window it manages.
  83.  *    In general, widget code should call this procedure
  84.  *    rather than Tk_ResizeWindow.
  85.  *
  86.  * Results:
  87.  *    None.
  88.  *
  89.  * Side effects:
  90.  *    The geometry manager for tkwin (if any) is invoked to
  91.  *    handle the request.  If possible, it will reconfigure
  92.  *    tkwin and/or other windows to satisfy the request.  The
  93.  *    caller gets no indication of success or failure, but it
  94.  *    will get X events if the window size was actually
  95.  *    changed.
  96.  *
  97.  *--------------------------------------------------------------
  98.  */
  99.  
  100. void
  101. Tk_GeometryRequest(tkwin, reqWidth, reqHeight)
  102.     Tk_Window tkwin;        /* Window that geometry information
  103.                  * pertains to. */
  104.     int reqWidth, reqHeight;    /* Minimum desired dimensions for
  105.                  * window, in pixels. */
  106. {
  107.     register TkWindow *winPtr = (TkWindow *) tkwin;
  108.  
  109.     if ((reqWidth == winPtr->reqWidth) && (reqHeight == winPtr->reqHeight)) {
  110.     return;
  111.     }
  112.     winPtr->reqWidth = reqWidth;
  113.     winPtr->reqHeight = reqHeight;
  114.     if (winPtr->geomProc != NULL) {
  115.     (*winPtr->geomProc)(winPtr->geomData, tkwin);
  116.     }
  117. }
  118.  
  119. /*
  120.  *----------------------------------------------------------------------
  121.  *
  122.  * Tk_SetInternalBorder --
  123.  *
  124.  *    Notify relevant geometry managers that a window has an internal
  125.  *    border of a given width and that child windows should not be
  126.  *    placed on that border.
  127.  *
  128.  * Results:
  129.  *    None.
  130.  *
  131.  * Side effects:
  132.  *    The border width is recorded for the window, and all geometry
  133.  *    managers of all children are notified so that can re-layout, if
  134.  *    necessary.
  135.  *
  136.  *----------------------------------------------------------------------
  137.  */
  138.  
  139. void
  140. Tk_SetInternalBorder(tkwin, width)
  141.     Tk_Window tkwin;        /* Window that will have internal border. */
  142.     int width;            /* Width of internal border, in pixels. */
  143. {
  144.     register TkWindow *winPtr = (TkWindow *) tkwin;
  145.  
  146.     if (width == winPtr->internalBorderWidth) {
  147.     return;
  148.     }
  149.     if (width < 0) {
  150.     width = 0;
  151.     }
  152.     winPtr->internalBorderWidth = width;
  153.     for (winPtr = winPtr->childList; winPtr != NULL;
  154.         winPtr = winPtr->nextPtr) {
  155.     if (winPtr->geomProc != NULL) {
  156.         (*winPtr->geomProc)(winPtr->geomData, (Tk_Window) winPtr);
  157.     }
  158.     }
  159. }
  160.